package com.hjj.app;

import com.hjj.beans.Stu;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class MyApp {
    public static void main(String[] args) {
        // 获取类信息【反射】【几种方法】
        // 反射就是把C语言的Class实例信息转换为java语法的Class对象
        // 所有java类型的类是Class
        // 1、Class.forName() 方法
        // 2、Stu.class 特殊手法
        // 3、stu.getClass()

        Class<Stu> stuClass = Stu.class;
        // 默认只会取得根据Java访问修饰符定义的数据
        System.out.println("**********类的名字**********");
        System.out.println(stuClass.getName());

        System.out.println("**********类的属性**********");
        Field[] fields = stuClass.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }

        System.out.println("**********类的方法**********");
        Method[] methods = stuClass.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }

        System.out.println("**********类的构造方法**********");
        Constructor<?>[] constructors = stuClass.getConstructors();
        for (Constructor<?> constructor : constructors) {
            System.out.println(constructor);
        }

        System.out.println("###########################公开Stu定义的所有属性和方法##############################");

        // 使用getDeclaredxxx()方法取得类定义的信息
        System.out.println("**********类的属性**********");
        fields = stuClass.getDeclaredFields();
        for (Field field : fields) {
            // 放开权限【忽略访问修饰符】
            field.setAccessible(true);
            System.out.println(field);
        }

        System.out.println("**********类的方法**********");
        methods = stuClass.getDeclaredMethods();
        for (Method method : methods) {
            // 放开权限【忽略访问修饰符】
            method.setAccessible(true);
            System.out.println(method);
        }

        System.out.println("**********类的构造方法**********");
        constructors = stuClass.getDeclaredConstructors();
        for (Constructor<?> constructor : constructors) {
            // 放开权限【忽略访问修饰符】
            constructor.setAccessible(true);
            System.out.println(constructor);
        }
    }
}
